#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node *next;
} Node, *LinkList;

int m = sizeof(Node);

void CreateListHead(LinkList Head, int n) {
    LinkList newNode; // 声明一个指针，指向新节点
    int i;

    // 头结点的next指向NULL
    Head->next = NULL;

    for (i = 1; i <= n; i++) {
        newNode = (LinkList) malloc(m); // 开新空间！
        if (newNode == NULL) {
            fprintf(stderr, "Memory allocation failed\n");
            return; // 处理内存分配失败
        }

        printf("Enter data for node %d: ", i);
        scanf("%d", &newNode->data); // 为第i个结点赋值
        //头插法的链接操作
        newNode->next = Head->next; // 原来的首元结点L->next做新节点的后继
        Head->next = newNode; // 让新结点做首元结点
    }
}

void PrintList(LinkList L) {
    LinkList current = L->next; // 从头结点的下一个节点开始遍历  从首元结点开始进行遍历
    while (current != NULL) {
        printf("%d -> ", current->data);
        current = current->next;
    }
    printf("NULL\n");
}

//头插法
int main() {
    Node head; // 创建头结点
    LinkList L = &head; // L指向头结点 L就是头指针
    int n;
    printf("Enter the number of nodes: ");
    scanf("%d", &n);

    CreateListHead(L, n);
    PrintList(L); // 打印链表以验证

    return 0;
}
